/*
 * stateMachineTester.h
 *
 *  Created on: 19/nov/2009
 *      Author: juil
 */

#ifndef STATEMACHINETESTER_H_
#define STATEMACHINETESTER_H_
#include "stateMachine.h"
//codici messaggi
#define 	HAND_SHAKE_MACHINE_TIMEOUT_EVENT_CODE 	0x0003
#define 	HAND_SHAKE_MACHINE_RX_EVENT_CODE 		0x0004

//gestore trasmissione con hand-shake su can
typedef struct{
	StateMachine super;
	__attribute__((packed)) uint8_t retryCounter; //inizializzato e gestito dalla sua state machine
	__attribute__((packed)) uint8_t timer; //inizializzato e gestito dalla sua state machine
	void* canPort; //da settare in fase di inizializzazione pre-initEvent
	Notifier okEnder; //da settare in fase di inizializzazione pre-initEvent
	Notifier failEnder; //da settare in fase di inizializzazione pre-initEvent
	//strutture dati indispensabili a corretta gestione transazioni
	void* notifierTarget; //da settare in fase di inizializzazione pre-initEvent
	uint32_t paramCheck; //da settare in fase di inizializzazione pre-initEvent
	uint32_t msgIdentifier;  //da settare in fase di inizializzazione pre-initEvent
	__attribute__((packed)) uint8_t sizeTx; //da settare in fase di inizializzazione pre-initEvent
	__attribute__((packed)) uint8_t sizeRx; // gestito da notificatore
	uint8_t TxBuffer[8]; //da settare in fase di inizializzazione pre-initEvent
	uint8_t RxBuffer[8]; // gestito da notificatore
} HandShakeMachine;

//stati
StateOutcome HandshakeMachineTesterTXsentState (void* me,const Event* e);
StateOutcome HandshakeMachineTesterOkState (void* me,const Event* e);
StateOutcome HandshakeMachineTesterFailState (void* me,const Event* e);
//funzioni gestione ad alto livello
//inizializzatore pre-initEvent + starter
void initTransmission(HandShakeMachine* engine, void* port, uint32_t canId, uint8_t payloadSize, uint8_t* payload, uint32_t answerId, void* notifTarget, Notifier onOk, Notifier onFail);
#endif /* STATEMACHINETESTER_H_ */
